#!/bin/bash

# 定义配置文件路径
CONFIG_FILE="/etc/docker/install_config.conf"

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'

# 默认配置
DEFAULT_DOCKER_VERSION="latest"
DEFAULT_DOCKER_COMPOSE_VERSION="latest"

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 加载配置文件
load_config() {
    # 检查配置文件是否存在
    if [ ! -f "$CONFIG_FILE" ]; then
        log_warning "配置文件 $CONFIG_FILE 不存在，将使用默认配置"
        create_default_config
    fi

    # 加载配置
    source "$CONFIG_FILE"
}

# 创建默认配置文件
create_default_config() {
    # 确保目录存在
    mkdir -p "$(dirname "$CONFIG_FILE")"

    # 写入默认配置
    cat > "$CONFIG_FILE" << EOL
# Docker安装配置文件

# Docker版本 (latest 或具体版本号)
DOCKER_VERSION="latest"

# Docker Compose版本 (latest 或具体版本号)
DOCKER_COMPOSE_VERSION="latest"

# Docker仓库源列表（按优先级顺序）
DOCKER_REPOS=(
    "https://download.docker.com/linux/centos/docker-ce.repo"
    "https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo"
    "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo"
)
EOL

    log_info "已创建默认配置文件: $CONFIG_FILE"
}

# 验证Docker源可用性
validate_docker_repo() {
    local repo_url=$1
    local temp_repo_file=$(mktemp)

    log_info "正在验证Docker仓库源: $repo_url"

    # 使用curl下载仓库文件并检查
    curl -sSL "$repo_url" -o "$temp_repo_file"

    # 检查下载是否成功
    if [ $? -ne 0 ]; then
        log_error "无法访问Docker仓库源: $repo_url"
        rm -f "$temp_repo_file"
        return 1
    }

    # 检查文件内容是否包含有效的仓库信息
    if ! grep -q "docker-ce" "$temp_repo_file"; then
        log_error "仓库源 $repo_url 不包含有效的Docker仓库信息"
        rm -f "$temp_repo_file"
        return 1
    }

    # 清理临时文件
    rm -f "$temp_repo_file"

    log_info "Docker仓库源验证成功: $repo_url"
    return 0
}

# 选择可用的Docker源
select_available_repo() {
    log_warning "正在选择可用的Docker仓库源..."

    # 遍历配置中的仓库源
    for repo in "${DOCKER_REPOS[@]}"; do
        if validate_docker_repo "$repo"; then
            echo "$repo"
            return 0
        fi
    done

    log_error "无法找到可用的Docker仓库源"
    return 1
}

# 获取具体版本号
get_specific_version() {
    local version=$1
    local repo=$2

    if [ "$version" == "latest" ]; then
        if [ "$repo" == "docker" ]; then
            # 获取Docker最新版本
            version=$(curl -s https://api.github.com/repos/docker/docker-ce/releases/latest | grep '"tag_name":' | sed -E 's/.*"v?([^"]+)".*/\1/')
        elif [ "$repo" == "compose" ]; then
            # 获取Docker Compose最新版本
            version=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
        fi
    fi

    echo "$version"
}

# 主安装函数
install_docker() {
    # 检查root权限
    if [ "$(id -u)" != "0" ]; then
        log_error "此脚本必须以root权限运行。请使用sudo执行。"
        exit 1
    fi

    # 选择可用的仓库源
    SELECTED_REPO=$(select_available_repo)
    if [ $? -ne 0 ]; then
        log_error "无法找到可用的Docker仓库源"
        exit 1
    fi

    # 获取具体版本
    SPECIFIC_DOCKER_VERSION=$(get_specific_version "$DOCKER_VERSION" "docker")
    log_info "将安装Docker版本: $SPECIFIC_DOCKER_VERSION"

    # 更新系统
    log_info "正在更新系统包..."
    yum update -y

    # 安装依赖
    log_info "正在安装必要的依赖包..."
    yum install -y yum-utils device-mapper-persistent-data lvm2 wget

    # 删除旧版本Docker
    log_info "正在卸载旧版本Docker（如果存在）..."
    yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

    # 设置Docker仓库
    log_info "正在设置Docker仓库: $SELECTED_REPO"
    yum-config-manager --add-repo "$SELECTED_REPO"

    # 安装指定版本Docker Engine
    log_info "正在安装Docker Engine..."
    if [ "$SPECIFIC_DOCKER_VERSION" == "latest" ]; then
        yum install -y docker-ce docker-ce-cli containerd.io
    else
        yum install -y docker-ce-"$SPECIFIC_DOCKER_VERSION" docker-ce-cli-"$SPECIFIC_DOCKER_VERSION" containerd.io
    fi

    # 启动Docker服务
    log_info "正在启动Docker服务..."
    systemctl start docker
    systemctl enable docker

    # 验证Docker安装
    docker version
}

# 安装Docker Compose
install_docker_compose() {
    # 获取具体Docker Compose版本
    SPECIFIC_COMPOSE_VERSION=$(get_specific_version "$DOCKER_COMPOSE_VERSION" "compose")
    log_info "将安装Docker Compose版本: $SPECIFIC_COMPOSE_VERSION"

    log_info "下载Docker Compose ${SPECIFIC_COMPOSE_VERSION}..."
    curl -L "https://github.com/docker/compose/releases/download/${SPECIFIC_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    # 添加执行权限
    chmod +x /usr/local/bin/docker-compose

    # 验证安装
    docker-compose version
}

# 配置Docker用户组
configure_docker_group() {
    # 获取当前登录用户
    CURRENT_USER=$(logname)

    if [ -n "$CURRENT_USER" ]; then
        log_info "将用户 $CURRENT_USER 添加到docker用户组..."
        usermod -aG docker "$CURRENT_USER"
    else
        log_warning "无法确定当前用户，跳过用户组配置"
    fi
}

# 主执行流程
main() {
    # 加载配置
    load_config

    log_info "开始Docker安装流程..."

    # 捕获并处理可能的安装错误
    {
        install_docker
        install_docker_compose
        configure_docker_group
    }

    log_info "Docker和Docker Compose安装完成！"
    log_warning "建议重新登录或重启系统以使更改生效"
}

# 执行主函数
main "$@" 2>&1 | tee /var/log/docker_install.log